{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "from sklearn.model_selection import train_test_split,cross_val_score   #划分数据 交叉验证\n",
    "from sklearn.model_selection import StratifiedKFold\n",
    "import lightgbm as lgb\n",
    "import numpy as np\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn import metrics\n",
    "from sklearn.metrics import accuracy_score\n",
    "import time\n",
    "from pyspark.sql import SparkSession\n",
    "from concurrent.futures import ThreadPoolExecutor\n",
    "from sklearn.ensemble import VotingClassifier\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "from sklearn.ensemble import BaggingClassifier\n",
    "from sklearn.neural_network import MLPClassifier\n",
    "from sklearn.svm import SVC\n",
    "import xgboost as xgb\n",
    "import warnings\n",
    "import pickle\n",
    "from hyperopt import fmin, tpe, hp, STATUS_OK, Trials\n",
    "from catboost import CatBoostClassifier\n",
    "from sklearn.ensemble import AdaBoostClassifier\n",
    "from sklearn.ensemble import GradientBoostingClassifier\n",
    "import hyperopt.pyll.stochastic\n",
    "import matplotlib.pyplot as plt\n",
    "from skdist.distribute.search import DistGridSearchCV,DistRandomizedSearchCV\n",
    "from sklearn.ensemble import BaggingClassifier,RandomForestClassifier,ExtraTreesClassifier,GradientBoostingClassifier\n",
    "warnings.filterwarnings('ignore')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# import os\n",
    "# os.environ['JAVA_HOME'] = '/home/carl-hui/software/jdk-13.0.1'  # 这里的路径为java的bin目录所在路径"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# all_data = pd.read_csv('data_demo4.csv')\n",
    "# train_all_data=all_data[:28000]\n",
    "# test_all_data=all_data[28000:]\n",
    "# train_all_data[\"type\"] = train_all_data[\"type\"].map({'围网':0,'刺网':1,'拖网':2})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_all_data = pd.read_hdf('data/train_transform.h5')\n",
    "test_all_data = pd.read_hdf('data/test_transform.h5')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_train = train_all_data.drop(['type'], axis=1)\n",
    "y_train = train_all_data[\"type\"]\n",
    "X_test = test_all_data.drop(['ship'], axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "feature_importance = pd.read_csv('data/feature_importance.csv')\n",
    "feature_importance_list = feature_importance.loc[feature_importance[\"importance\"] != 0][\"feature_name\"].tolist()\n",
    "\n",
    "X_train=X_train[feature_importance_list]\n",
    "X_test=X_test[feature_importance_list]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "#boruta 模型\n",
    "with open(\"data/feat_selector.pkl\", 'rb') as fo:     \n",
    "    feat_selector = pickle.load(fo)\n",
    "X_train = feat_selector.transform(X_train.values)\n",
    "X_test = feat_selector.transform(X_test.values)\n",
    "X_train=pd.DataFrame(X_train)\n",
    "X_test=pd.DataFrame(X_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "#X_train, X_test, y_train, y_test = train_test_split(X_data, Y_data, test_size=0.3, random_state=42)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "def f(params):\n",
    "    acc = hyperopt_train_test(params)\n",
    "    return {'loss': -acc, 'status': STATUS_OK}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "def print_params_bast(best,parmss):\n",
    "    print(\"最好的参数{}\".format(best))\n",
    "    print(hyperopt.pyll.stochastic.sample(parmss))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plt_trials(trials):\n",
    "    for key in trials.trials[:1][0]['misc']['vals'].keys():\n",
    "        f, ax = plt.subplots(1)\n",
    "        xs = [t['tid'] for t in trials.trials]\n",
    "        ys = [t['misc']['vals'][key] for t in trials.trials]\n",
    "        ax.set_xlim(xs[0]-10, xs[-1]+10)\n",
    "        ax.scatter(xs, ys, s=20, linewidth=0.01, alpha=0.75)\n",
    "        ax.set_title('$x$ $vs$ $t$ ', fontsize=18)\n",
    "        ax.set_xlabel('$t$', fontsize=16)\n",
    "        ax.set_ylabel('$'+key+'$', fontsize=16)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### LGBMClassifier lgb参数搜索"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 最好的参数{'boosting': 0, 'learning_rate': 0.23671999358049298, 'max_depth': 2,\n",
    "#'min_child_samples': 2, 'n_estimators': 2}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "def hyperopt_train_test(params):\n",
    "    clf = lgb.LGBMClassifier(**params)\n",
    "    return cross_val_score(clf,X_train,y_train).mean()\n",
    "\n",
    "space4knn = {\n",
    "    'learning_rate': hp.uniform('learning_rate', 0.1, 0.7),\n",
    "    'min_child_samples': hp.choice('min_child_samples', range(7,10)),\n",
    "    'max_depth': hp.choice('max_depth', range(7,10)),\n",
    "    'boosting': hp.choice('boosting', [\"gbdt\",\"dart\",\"goss\"]),\n",
    "    'n_estimators': hp.choice('n_estimators', np.arange(2000,3000,100)),\n",
    "    'objective': \"multiclass\",\n",
    "    'metric': 'multi_error',\n",
    "    \"num_class\":3,\n",
    "    \"feature_fraction\":0.75,\n",
    "    \"bagging_fraction\":0.85,\n",
    "    \"seed\":99,\n",
    "    \"device\":\"cpu\",\n",
    "    \"lambda_l1\":2,\n",
    "}\n",
    "\n",
    "\n",
    "trials = Trials()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "100%|██████████| 100/100 [1:55:18<00:00, 69.18s/trial, best loss: -0.9019999999999999]\n",
      "最好的参数{'boosting': 1, 'learning_rate': 0.28810319992794875, 'max_depth': 0, 'min_child_samples': 0, 'n_estimators': 0}\n",
      "{'bagging_fraction': 0.85, 'boosting': 'gbdt', 'device': 'cpu', 'feature_fraction': 0.75, 'lambda_l1': 2, 'learning_rate': 0.11285527049733735, 'max_depth': 9, 'metric': 'multi_error', 'min_child_samples': 7, 'n_estimators': 2400, 'num_class': 3, 'objective': 'multiclass', 'seed': 99}\n",
      "6918.092025756836\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZEAAAEgCAYAAAB1t06HAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nO3deZgddZ3v8feHkAQSgoBpomQhLEFZlCQcAwqjuCBBGcK4hosjMvpkxgsjLuOIy5URRh2v4zIoI2YggvfKNggm44DAFRRc4KbDaoIxIQpJWNJDWAKBhDTf+aOqQ6VzTs6p6nO6zun+vJ6nnz71W6q+VdXkS9Wv6vwUEZiZmRWxU9kBmJlZ53ISMTOzwpxEzMysMCcRMzMrzEnEzMwKcxIxM7PCnETMzKwwJxGzIUrS6ZLOKjsOG9rklw3NhiZJPcAdEXFi2bHY0OUrEbMhSNKBwHjg9rJjsaHNScSsQZJ2lbRG0kOSRveru0hSr6S5O+h/saSQ1FWl7kBJmyVdmCnbXdLnJd0r6SlJT0taJumCOnH+BFiRLp6XbjMk/WO+PTarb+eyAzDrFBHxnKRzgIuA/wl8C0DSV4EPA2dExBU7WMW96e/DgFv61X0NeB74YrrO0cBtwL7AD4BlwBjgNcC0OqHOB0YAJwIfBZ5Jy39bp59Zbh4TMctB0gjgHmBvYH/gIyTJ5JyIOLdO3zcDNwMfi4jvZMrfAPwa+FxEfDUtey9wFXB8RNxYIM6FwOsjYu+8fc3y8O0ssxwiohc4G+gCFgLfBL5TL4GkslciWd8AHiK9skntmf6eJanIf6czgbsK9DPLxUnELKeI+CnJP9BvAa4EGnqMNiIeBx4GDu0rk/Q+4CiSq5DnM82vJrniOQ94WNK/STqxkYSSjrlMAu5sbI/MinMSMctJ0vuBw9PFDZHvnvC9pElE0ijgq8Bi4LJso4hYDxwBzCZJVMcB/wH8Ku23IzPT304i1nJOImY5SHo78EPgWuAK4K8kHZxjFfcCe0iaBJxBMq7yqWqJKCJ6I+KGiDgLOAD4v8DreSmB1TIj/e0kYi3nJGLWIElHAteQDIKfCnwBeJHkaqJRfeMif5b2vyYibuu3nS5JypalYzG9QABr62xj//T3QzniMivEj/iaNUDSIcB1wB+AkyNiE/CApIuBv5F0dET8uoFV9SWRbwPjgM9UafPPwDHpE1YrSf5n73iSR3a/HhEP19nGqvT3+ZJ+S5J8Lst5282sIX7E16wOSVNIrj42AUdHxGOZun1I/qG/KyKObmBdI0ne2xgFfDsiPlGlzQeBvnGXLmA9yXsi50fEwga2MQa4EDiB5K31hyJi33r9zIpwEjEzs8I8JmJmZoU5iZiZWWFOImZmVpiTiJmZFTbsHvEdP358TJ06tewwzMw6xpIlS/4rIrabwgCGYRKZOnUq3d3dZYdhZtYxJD1Yq863s8zMrDAnETMzK8xJxMzMCnMSMTOzwpxEzMysMCcRMzMrrNQkImmypFskLZO0VNJ204wqcb6klZLulTQzU3eapBXpz2mDG72ZmZX9nsgWklnd7pQ0Dlgi6aaIWJZpcwIwLf05EvgecKSkvYBzgArJRD1LJC2KiCcGdxeq6+19kYX3PMyKxzawf9dYJHhg3bNMmzCOk6fvw0471c/ffetY/shTbNjUy+677MxBr9i9av/s9opso5F+RbdRpkZirtemnY9tM85JJ53XgcZaxnFu5vFtx3NVahKJiEeAR9LPGyTdD0wkmTuhzxzgh+mEOrdL2kPSK4FjgZvSuaiRdBPJfNSXD+Iu1LTwnoe5qns1ADcufRQkusaN5q7VTwLwrpmTGl5Hz9PP0/PMZrrGjebuNU9V7Z/dXpFtNNKv6DbK1EjM9dq087FtxjnppPM60FjLOM7NPL7teK7a5n83JE0lmRv6jn5VE4HVmeU1aVmt8mrrniepW1J3T09Ps0LeoRWPbdj6eeMLvTy3ubdqXSPr2PhC0rdvHdX69y/Lu41G+hXdRpkaiblem3Y+ts04J510XgcaaxnHuZnHtx3PVVskEUm7AT8GPh4RTzd7/RExPyIqEVHp6qr69S9NN23CuK2fx4wcwa6jRlSta2QdY0YmffvWUa1//7K822ikX9FtlKmRmOu1aedj24xz0knndaCxlnGcm3l82/FclT0m0jdd6I+BH0XENVWarAUmZ5YnpWVrSW5pZct/0Zoo8zt5+j5A8n8KB3SNhX5jInnWUW1MZEfbK7KNRvoV3UaZGom5Xpt2PrbNOCeddF4HGmsZx7mZx7cdz1Wp0+NKEnApsD4iPl6jzTuBM4F3kAysnx8Rs9KB9SVA39NadwJH9I2R1FKpVMJfwGhm1jhJSyKiUq2u7CuRo4G/BO6TdHda9jlgCkBEXAhcR5JAVgIbgdPTuvWSzgMWp/3OrZdAzMysucp+OutXgOq0CeCMGnULgAUtCM3MzBrQFgPrZmbWmZxEzMysMCcRMzMrzEnEzMwKcxIxM7PCnETMzKwwJxEzMyvMScTMzApzEjEzs8KcRMzMrDAnETMzK8xJxMzMCnMSMTOzwpxEzMysMCcRMzMrzEnEzMwKK3VSKkkLgBOBdRFxWJX6TwOnpos7AwcDXemshn8CNgC9wJZaUzeamVnrlH0lcgkwu1ZlRHw9IqZHxHTgs8Av+02B++a03gnEzKwEpSaRiLgVaHRe9FOAy1sYjpmZ5VT2lUhDJI0huWL5caY4gBslLZE0r07/eZK6JXX39PS0MlQzs2GlI5II8OfAr/vdyjomImYCJwBnSHpjrc4RMT8iKhFR6erqanWsZmbDRqckkbn0u5UVEWvT3+uAa4FZJcRlZjastX0SkfQy4E3AwkzZWEnj+j4Dbwd+V06EZmbDV9mP+F4OHAuMl7QGOAcYCRARF6bN/gK4MSKezXSdAFwrCZJ9uCwifjZYcZuZWaLUJBIRpzTQ5hKSR4GzZauAw1sTlZmZNartb2eZmVn7chIxM7PCnETMzKwwJxEzMyvMScTMzApzEjEzs8KcRMzMrDAnETMzK8xJxMzMCnMSMTOzwpxEzMysMCcRMzMrzEnEzMwKcxIxM7PCnETMzKywUpOIpAWS1kmqOiuhpGMlPSXp7vTni5m62ZKWS1op6ezBi9rMzPqUfSVyCTC7TpvbImJ6+nMugKQRwAXACcAhwCmSDmlppGZmtp1Sk0hE3AqsL9B1FrAyIlZFxGbgCmBOU4MzM7O6yr4SacTrJd0j6XpJh6ZlE4HVmTZr0rKqJM2T1C2pu6enp5WxmpkNK+2eRO4E9o2Iw4HvAD8pspKImB8RlYiodHV1NTVAM7PhrK2TSEQ8HRHPpJ+vA0ZKGg+sBSZnmk5Ky8zMbBC1dRKR9ApJSj/PIon3cWAxME3SfpJGAXOBReVFamY2PO1c5sYlXQ4cC4yXtAY4BxgJEBEXAu8BPippC/AcMDciAtgi6UzgBmAEsCAilpawC2Zmw5qSf5OHj0qlEt3d3WWHYWbWMSQtiYhKtbq2vp1lZmbtzUnEzMwKcxIxM7PCnETMzKwwJxEzMyvMScTMzApzEjEzs8KcRMzMrDAnETMzK8xJxMzMCnMSMTOzwnIlEUkfl/RGSbu1KiAzM+sceb/F96vAKCAkPQAsIZk4aglwZ0Q81eT4zMysjeVNIocCN5HMi74SmAL8OTCGJLHcA8wH/i0iXmxmoGZm1n7yjolcCFwbEa+LiFMi4hhgX5Kpa58AfgN8GbhBUqlzlZiZWevlTSLHANdlCyJifUR8HLiG5AqlQnLF8ul6K5O0QNI6Sb+rUX+qpHsl3SfpN5IOz9T9KS2/W5InCDEzK0HeJLIOmFGj7krggxHxJ+BbwKkNrO8SYPYO6v8IvCkiXgOcR3KrLOvNETG91mQpZmbWWnmTyA+BL0iqlkgmAuPTz0uAA+qtLCJuJbl6qVX/m4h4Il28HZiUL1wzM2ulvOMW5wGHA7dLupLk1tajwKtI5kfvu600GnihWUGmPgxcn1kO4EZJAXw/IvpfpZiZWYvlSiIR8QIwR9I8kjGPD5D8Yy5gKfDXadPXAw80K0hJbyZJIsdkio+JiLWS9gZukvT79MqmWv95wDyAKVOmNCssM7Nhr9Ab6xExPyKmkdyyeiPwauC1EfGHtMl1wKeaEaCk1wIXAXMi4vFMDGvT3+uAa4FZdeKtRESlq6urGWGZmRn5b2cBIGl0RGyKiD+SDH5vIyJuH3BkyXamkDz19ZeZBIWkscBOEbEh/fx24NxmbNPMzBqXK4lIOha4FJgk6WngXpI31u9Kfy/L85KhpMuBY4HxktaQjKuMBIiIC4EvAi8H/lUSwJb0SawJwLVp2c7AZRHxszz7YmZmA6eIaLyxtJTkFtj5JE9izUh/9k2bPB8RY5odZDNVKpXo7vZrJWZmjZK0pNarFHlvZ+0HvDci/rPfBvYAZgLTi4VoZmadKG8S+T3p7aasiHgSuDn9MTOzYSLv01nfBD7SikDMzKzz5E0ibwQOlnSlpFe1IiAzM+sceW9nvYHk69/3A96TPlHVf06Rx5obopmZtau8b6wfJmk08BqSp7Kmp78/A4wleXt9RLODNDOz9lQ3iUg6KvvyYERsIvmOrO5MG5F8f9bh26/BzMyGqkauRH6TJpL/L+likhcL7wLuiYhnACJ52eT36Y+ZmQ0TjSSRI4FV6ecjSL50cSTwYjrP+l2Zn7vT77IyM7NhoG4SiYjFmc/TJY0EDuOlt9VnAO/EYyJmZsNO3u/O+nfgkxHRd+XRVy5gGrVnPTQzsyEo73si7wZe2b8wHRPpAVY3IygzM+sMjTyd9aq03f11mh4E3IZvZ5mZDRuNXInMBe4DniEZ8/icpI9JOkbSbpl2LwOeb0GMZmbWphoZE/kmcCvJt/R+nWRQfTYwipee0FpG8o7IvS2K08zM2lDdK5GI2BARt0TEN0jeA3k/MI4kqcwDbgR2Jxlo95czmpkNI3m/9uSQzOLd6c+ASFoAnAisi4jDqtQL+BfgHcBG4EMRcWdadxrwhbTpP0bEpQONx8zMGldojvUmuwT4LvDDGvUnkDw+PI3kxcfvAUdK2otkOt0KyVjNEkmLIuKJlkfcZL29L7LwnodZ8dgGpk0Yx8nT92GnnapfJOZpO5Dt9bVZ/shTbNjUy+677MxBr9h9a9vsOvbvGosED6x7duvnFY9u2NrvgL13266+1uei/Wqto5GY+45BBA0fl/5t6h3TPP1qxZEn/mr1AzkG1fqVcY5bta+NrGOw+9X7e24XeafH/QHwdESclSk7iiQZ/TryrGzb9U4FflrjSuT7wC8i4vJ0eTnJvOzHAsdGxF9Xa1dLO06Pe82da7iq+6Wno99Xmcy7Zk4acNuBbK+vTc/Tz9PzzGa6xo2ma9zorW2z6+h5+nmQ6Bo3eutnIrb2I2K7+lqfi/artY5GYu47BkDDx6V/m3rHNE+/WnHkib9a/UCOQbV+ZZzjVu1rI+sY7H71/p4HUzOnx30z8OXMis8gmW8d4A5Jx0XEs8XCrGki275/siYtq1W+HUnzSMZvmDJlSpPDG7gVj23Y4XLRtgNZR1/Zxhd6AXhuc+825dk+G1/oRWibz0Fs7RfEdvXN7ldrHY3EXO8YNHLs6h3Tov2Kxl+rvugxqNavjHPcqn1tZB2D3a/e33O7yHtNNAFYkVk+C7iGZLKqvYG/a1JcTRUR8yOiEhGVrq6ussPZzrQJ43a4XLTtQNbRVzZmZPLaz66jRmxTnu0zZuSIrfV9n7P9qtU3u1+tdTQSc19dnuPSf7le3zz9GmlbL/5q9XnXUa9fGee4VfvayDoGu1+9v+d2kfdK5AlgVwBJhwEHACdFxO8lfYUkiXypuSGyFpicWZ6Ulq0luaWVLf9Fk7c9KE6evg/ANvdPm9F2IOvoK6s2JtJ/HQd0jYX0/m7f5+x93AP33m27+lqfi/artY5GYu5/DBo5Lv3b1DumRfrtqG29+GvVFz0G1fqVcY5bta+NrGOw+9X7e24XecdEFgI9EfERSV8H/iIiDkzr3ghcHxFjcwex4zGRdwJnkjyddSRwfkTMSgfWl5A8agzJ7IpHRMT6HW2rHcdEzMzaWTPHRL4C3CrpGOBA4LxM3UQg93iIpMtJrijGp9PtnkPyVfNExIXAdSQJZCXJI76np3XrJZ0H9H3L8Ln1EoiZmTVX3vdE7kgTyKnAOpI32Pu8DVieN4CIOKVOfQBn1KhbACzIu00zM2uO3O+JpPOLLK5S9Rxw5YAjMjOzjlH4ZUNJoyJic99yRJzZnJDMzKxT5HrEV9LOkr4saR3wnKQeSVdIekOL4jMzszaW9z2RzwOfJHk35DPAZcChwG2Szm5ybGZm1uby3s76IPC5iPhWtlDSXwH/Kun+iFjYtOjMzKyt5b0SeSXJ+xjbSJ+S+jZt+sa6mZm1Rt4ksgKYXqPuZyQTU5mZ2TCRN4lcDHxRUrVEMolkCl0zMxsm8o6JfAd4E3C7pKuA64FHSd5eP4fkasTMzIaJvG+sh6T3Ap8g+QbfD2SqbwQ+1cTYzMyszRV5Y/1F4BuSvgvsC3QBD0bEmmYHZ2Zm7W0gLxtuBH4N/C3QfjM9mZlZy/llQzMzK8wvG5qZWWF+2dDMzAor/WVDSbMlLZe0stotMUnfknR3+vMHSU9m6nozdYvybtvMzAYm7+2si4FzJP0yIu7uV5f7ZUNJI4ALgOOANcBiSYsiYllfm4j4RKb93wIzMqt4LiJqJTUzM2uxsl82nAWsjIhVAJKuAOYAy2q0PyXdjpmZtYGyXzacCKzOLK8BjqzWUNK+wH7AzZniXSR1A1uAf4qIn+TcvpmZDUDhlw1JXjg8iMF72XAucHVE9GbK9o2ItZL2B26WdF9EPNC/o6R5wDyAKVP8SouZWbPkHVhH0q6S3ibpFGACcMcAEshaYHJmeVJaVs1c4PJsQUSsTX+vAn7BtuMl2XbzI6ISEZWurq6CoZqZWX9531ifAfwBuAH4EfBLYJ2k/yWpyHzti4FpkvaTNIokUWz3lJWkVwN7Ar/NlO0paXT6eTxwNLXHUszMrAXyXolcAGwG3kFy1fA6kie2Pg38XNKueVYWEVuAM0mS0v3AVRGxVNK5kk7KNJ0LXBERkSk7GOiWdA9wC8mYiJOImdkg0rb/LtdpLD0DnBYRP+5XPgm4lWTM4u+bG2JzVSqV6O7uLjsMM7OOIWlJRFSq1eW9EnkQeLZ/YTom8iXg1PzhmZlZp6qbRCQdL2mvdPHbwEdrNF0NvKxZgZmZWftr5ErkeqBH0gPAW4GZkv4zO0WupJ2A0/HMhmZmw0ojT1QdBByR/swExgInALPTxPIwcACwCTixRXGamVkbqptEImIlsBK4sq8sfblvJi8ll11J3j5fCoxoSaRmZtZ2irzb0fdy3yrg6r6y9GtJjmhSXGZm1gEKJZFqIuJBkqe3zMxsmMj9tSdmZmZ9nETMzKwwJxEzMyvMScTMzApzEjEzs8KcRMzMrDAnETMzK8xJxMzMCnMSMTOzwkpPIpJmS1ouaaWks6vUf0hSj6S705+PZOpOk7Qi/TltcCM3M7Omfe1JEZJGkEy5exywBlgsaVGVaW6vjIgz+/XdCzgHqAABLEn7PjEIoZuZGeVficwCVkbEqojYDFwBzGmw7/HATRGxPk0cNwGzWxSnmZlVUXYSmUgyI2KfNWlZf++WdK+kqyVNztkXSfMkdUvq7unpaUbcZmZG+UmkEf8BTI2I15JcbVyadwURMT8iKhFR6erqanqAZmbDVdlJZC0wObM8KS3bKiIej4hN6eJFvDRnSd2+ZmbWWmUnkcXANEn7SRoFzAUWZRtIemVm8STg/vTzDcDbJe0paU/g7WmZmZkNklKfzoqILZLOJPnHfwSwICKWSjoX6I6IRcDHJJ0EbAHWAx9K+66XdB5JIgI4NyLWD/pOmJkNY4qIsmMYVJVKJbq7u8sOw8ysY0haEhGVanVl384yM7MO5iRiZmaFOYmYmVlhTiJmZlaYk4iZmRXmJGJmZoU5iZiZWWFOImZmVpiTiJmZFeYkYmZmhTmJmJlZYU4iZmZWmJOImZkV5iRiZmaFOYmYmVlhpScRSbMlLZe0UtLZVeo/KWmZpHsl/VzSvpm6Xkl3pz+L+vc1M7PWKnVmQ0kjgAuA44A1wGJJiyJiWabZXUAlIjZK+ijwv4H3p3XPRcT0QQ3azMy2KvtKZBawMiJWRcRm4ApgTrZBRNwSERvTxduBSYMco5mZ1VB2EpkIrM4sr0nLavkwcH1meRdJ3ZJul3RyrU6S5qXtunt6egYWsZmZbVXq7aw8JH0AqABvyhTvGxFrJe0P3Czpvoh4oH/fiJgPzIdkjvVBCdjMbBgo+0pkLTA5szwpLduGpLcBnwdOiohNfeURsTb9vQr4BTCjlcGamdm2yk4ii4FpkvaTNAqYC2zzlJWkGcD3SRLIukz5npJGp5/HA0cD2QF5MzNrsVJvZ0XEFklnAjcAI4AFEbFU0rlAd0QsAr4O7Ab8uySAhyLiJOBg4PuSXiRJhv/U76kuMzNrMUUMryGCSqUS3d3dZYdhZtYxJC2JiEq1urJvZ5mZWQdzEjEzs8KcRMzMrDAnETMzK8xJxMzMCnMSMTOzwpxEzMysMCcRMzMrzEnEzMwKcxIxM7PCnETMzKwwJxEzMyvMScTMzApzEjEzs8KcRMzMrDAnETMzK6z0JCJptqTlklZKOrtK/WhJV6b1d0iamqn7bFq+XNLxgxm3mZmVPD2upBHABcBxwBpgsaRF/aa5/TDwREQcKGku8DXg/ZIOIZmT/VBgH+D/STooInoHdy8a19v7IgvveZgVj21g/66xSPDAumeZNmEcJ0/fh5122mmbNtnyeuurto7ljzzFhk297L7Lzhyw925Vt9fI+oajRo5FtTYRFOqX9xw3e19ate3B1onHqxOPc1apSQSYBayMiFUAkq4A5gDZJDIH+If089XAd5VMtj4HuCIiNgF/lLQyXd9vByn23Bbe8zBXda8G4Malj4JE17jR3LX6SQDeNXPSNm2y5fXWV20dPU8/T88zm+kaN5qblj1WdXuNrG84auRYVGsDFOqX9xw3e19ate3B1onHqxOPc1bZSWQisDqzvAY4slabiNgi6Sng5Wn57f36Tqy2EUnzgHkAU6ZMaUrgRax4bMPWzxtf6EVou7psm2rLO6rrv46NLyQXZc9t7iWIqttrZH3DUSPHokibRvsVadvsdXTi30MnHq9OPM5ZnXPNNAARMT8iKhFR6erqKi2OaRPGbf08ZuQIdh01Yru6bJtqyzuq67+OMSOT9e86akTN7TWyvuGokWNRrU3RfgOJo56i6+jEv4dOPF6deJyzyr4SWQtMzixPSsuqtVkjaWfgZcDjDfZtKydP3wdI/k/jgK6x0G+Mon+bbHm99VVbR3ZM5MC9d6u6vUbWNxw1cix21KZov4G0bfY6OvHvoROPVyce5yxFRHkbT5LCH4C3kiSAxcD/iIilmTZnAK+JiL9JB9bfFRHvk3QocBnJOMg+wM+BafUG1iuVSnR3d7dmh8zMhiBJSyKiUq2u1CuRdIzjTOAGYASwICKWSjoX6I6IRcDFwP9JB87XkzyRRdruKpJB+C3AGe38ZJaZ2VBU6pVIGXwlYmaWz46uRIbFwLqZmbWGk4iZmRXmJGJmZoU5iZiZWWFOImZmVtiwezpLUg/w4CBucjzwX4O4vcHm/et8Q30fvX8Dt29EVP26j2GXRAabpO5aj8YNBd6/zjfU99H711q+nWVmZoU5iZiZWWFOIq03v+wAWsz71/mG+j56/1rIYyJmZlaYr0TMzKwwJxEzMyvMSaRFJM2WtFzSSklnlx3PQEmaLOkWScskLZV0Vlq+l6SbJK1If+9ZdqwDIWmEpLsk/TRd3k/SHel5vFLSqLJjHAhJe0i6WtLvJd0v6fVD6RxK+kT69/k7SZdL2qXTz6GkBZLWSfpdpqzqOVPi/HRf75U0s9XxOYm0gKQRwAXACcAhwCmSDik3qgHbAnwqIg4BjgLOSPfpbODnETGNZGKwTk+YZwH3Z5a/BnwrIg4EngA+XEpUzfMvwM8i4tXA4ST7OiTOoaSJwMeASkQcRjJH0Vw6/xxeAszuV1brnJ0ATEt/5gHfa3VwTiKtMQtYGRGrImIzcAUwp+SYBiQiHomIO9PPG0j+8ZlIsl+Xps0uBU4uJ8KBkzQJeCdwUbos4C3A1WmTTt+/lwFvJJnojYjYHBFPMoTOIclEe7ums6aOAR6hw89hRNxKMiFfVq1zNgf4YSRuB/aQ9MpWxuck0hoTgdWZ5TVp2ZAgaSowA7gDmBARj6RVjwITSgqrGb4N/D3wYrr8cuDJiNiSLnf6edwP6AF+kN6yu0jSWIbIOYyItcA/Aw+RJI+ngCUMrXPYp9Y5G/R/e5xELBdJuwE/Bj4eEU9n6yJ5XrwjnxmXdCKwLiKWlB1LC+0MzAS+FxEzgGfpd+uqw8/hniT/J74fsA8wlu1vAw05ZZ8zJ5HWWAtMzixPSss6mqSRJAnkRxFxTVr8WN/lcvp7XVnxDdDRwEmS/kRy+/EtJOMHe6S3RqDzz+MaYE1E3JEuX02SVIbKOXwb8MeI6ImIF4BrSM7rUDqHfWqds0H/t8dJpDUWA9PSp0JGkQzuLSo5pgFJxwcuBu6PiG9mqhYBp6WfTwMWDnZszRARn42ISRExleR83RwRpwK3AO9Jm3Xs/gFExKPAakmvSoveCixjiJxDkttYR0kak/699u3fkDmHGbXO2SLgg+lTWkcBT2Vue7WE31hvEUnvILnHPgJYEBFfLjmkAZF0DHAbcB8vjRl8jmRc5CpgCslX7L8vIvoPAnYUSccCfxcRJ0ran+TKZC/gLuADEbGpzPgGQtJ0kgcHRgGrgNNJ/mdySJxDSV8C3k/yNOFdwEdIxgQ69hxKuhw4luQr3x8DzgF+QpVzlibP75LcxtsInB4R3S2Nz0nEzMyK8u0sMzMrzEnEzMwKcxIxM7PCnETMzKwwJxEzMyvMScTMzApzEjFrA5J2l/QPkg4uOxazPJxEzNpDheQlspFlB2KWh5OIWXuYAWwi+ZoOs47hN9bNSibpfuDV/YqviYh3lxGPWR5OImYlk+w1cWEAAADESURBVPQ6ku92Wgp8JS1+JCIeLC8qs8bsXL+JmbXYPSRf2f2ddDY6s47hMRGz8h1K8q26d5YdiFleTiJm5ZtJMjPd3WUHYpaXk4hZ+WYAD/SfbtisEziJmJXvEPxor3UoD6yble9JYKak44GngBUR8XjJMZk1xI/4mpVM0mEk89e/FtgF+LOI+FW5UZk1xknEzMwK85iImZkV5iRiZmaFOYmYmVlhTiJmZlaYk4iZmRXmJGJmZoU5iZiZWWFOImZmVth/A3hJz8hr/znxAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "start = time.time()\n",
    "\n",
    "best = fmin(f, space4knn, algo=tpe.suggest, max_evals=100, trials=trials)\n",
    "print_params_bast(best,space4knn)\n",
    "plt_trials(trials)\n",
    "\n",
    "end = time.time()\n",
    "print(str(end-start))   "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### GradientBoostingClassifier gdbt 参数搜索"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "def hyperopt_train_test(params):\n",
    "    clf = GradientBoostingClassifier(**params)\n",
    "    return cross_val_score(clf,X_train,y_train).mean()\n",
    "\n",
    "spacegdbt = {\n",
    "    'n_estimators': hp.choice('n_estimators', np.arange(200,3000,100)),\n",
    "    'max_depth': hp.choice('max_depth', np.arange(2,10)),\n",
    "    'min_samples_split': hp.choice('min_samples_split', np.arange(2,10)),\n",
    "    'learning_rate': hp.uniform('learning_rate', 0.1, 0.7),\n",
    "}\n",
    "\n",
    "trialsgdbt = Trials()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "# {'learning_rate': 0.22461383601711735, 'min_samples_split': 5, 'max_depth': 7, 'n_estimators': 10}  0.9"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "# start = time.time()\n",
    "\n",
    "# best = fmin(f, spacegdbt, algo=tpe.suggest, max_evals=100, trials=trialsgdbt)\n",
    "# print_params_bast(best,spacegdbt)\n",
    "# plt_trials(trialsgdbt)\n",
    "\n",
    "# end = time.time()\n",
    "# print(str(end-start))  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### XGBClassifier xgb 参数搜索"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 最好的参数{'learning_rate': 0.14230129295508215, 'max_depth': 1, 'n_estimators': 7}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "def hyperopt_train_test(params):\n",
    "    clf = xgb.XGBClassifier(**params)\n",
    "    return cross_val_score(clf,X_train,y_train).mean()\n",
    "\n",
    "spacegdbt = {\n",
    "    'n_estimators': hp.choice('n_estimators', np.arange(200,3000,100)),\n",
    "    'max_depth': hp.choice('max_depth', np.arange(2,10)),\n",
    "    'learning_rate': hp.uniform('learning_rate', 0.1, 0.7),\n",
    "    'silent': True,\n",
    "    'objective': 'multi:softmax',\n",
    "}\n",
    "\n",
    "trialsgdbt = Trials()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      " 67%|██████▋   | 67/100 [11:56:22<5:52:50, 641.53s/trial, best loss: -0.9111428571428573]\n"
     ]
    },
    {
     "ename": "KeyboardInterrupt",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-20-b5e12b66977c>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      1\u001b[0m \u001b[0mstart\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtime\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtime\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mbest\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfmin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mspacegdbt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0malgo\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtpe\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msuggest\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmax_evals\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m100\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtrials\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtrialsgdbt\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      4\u001b[0m \u001b[0mprint_params_bast\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbest\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mspacegdbt\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      5\u001b[0m \u001b[0mplt_trials\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtrialsgdbt\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/software/env/AI/lib/python3.7/site-packages/hyperopt/fmin.py\u001b[0m in \u001b[0;36mfmin\u001b[0;34m(fn, space, algo, max_evals, timeout, loss_threshold, trials, rstate, allow_trials_fmin, pass_expr_memo_ctrl, catch_eval_exceptions, verbose, return_argmin, points_to_evaluate, max_queue_len, show_progressbar)\u001b[0m\n\u001b[1;32m    480\u001b[0m             \u001b[0mcatch_eval_exceptions\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcatch_eval_exceptions\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    481\u001b[0m             \u001b[0mreturn_argmin\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mreturn_argmin\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 482\u001b[0;31m             \u001b[0mshow_progressbar\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mshow_progressbar\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    483\u001b[0m         )\n\u001b[1;32m    484\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/software/env/AI/lib/python3.7/site-packages/hyperopt/base.py\u001b[0m in \u001b[0;36mfmin\u001b[0;34m(self, fn, space, algo, max_evals, timeout, loss_threshold, max_queue_len, rstate, verbose, pass_expr_memo_ctrl, catch_eval_exceptions, return_argmin, show_progressbar)\u001b[0m\n\u001b[1;32m    684\u001b[0m             \u001b[0mcatch_eval_exceptions\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcatch_eval_exceptions\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    685\u001b[0m             \u001b[0mreturn_argmin\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mreturn_argmin\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 686\u001b[0;31m             \u001b[0mshow_progressbar\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mshow_progressbar\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    687\u001b[0m         )\n\u001b[1;32m    688\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/software/env/AI/lib/python3.7/site-packages/hyperopt/fmin.py\u001b[0m in \u001b[0;36mfmin\u001b[0;34m(fn, space, algo, max_evals, timeout, loss_threshold, trials, rstate, allow_trials_fmin, pass_expr_memo_ctrl, catch_eval_exceptions, verbose, return_argmin, points_to_evaluate, max_queue_len, show_progressbar)\u001b[0m\n\u001b[1;32m    507\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    508\u001b[0m     \u001b[0;31m# next line is where the fmin is actually executed\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 509\u001b[0;31m     \u001b[0mrval\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexhaust\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    510\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    511\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0mreturn_argmin\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/software/env/AI/lib/python3.7/site-packages/hyperopt/fmin.py\u001b[0m in \u001b[0;36mexhaust\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    328\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mexhaust\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    329\u001b[0m         \u001b[0mn_done\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrials\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 330\u001b[0;31m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrun\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmax_evals\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mn_done\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mblock_until_done\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0masynchronous\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    331\u001b[0m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrials\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrefresh\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    332\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/software/env/AI/lib/python3.7/site-packages/hyperopt/fmin.py\u001b[0m in \u001b[0;36mrun\u001b[0;34m(self, N, block_until_done)\u001b[0m\n\u001b[1;32m    284\u001b[0m                 \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    285\u001b[0m                     \u001b[0;31m# -- loop over trials and do the jobs directly\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 286\u001b[0;31m                     \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mserial_evaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    287\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    288\u001b[0m                 \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrials\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrefresh\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/software/env/AI/lib/python3.7/site-packages/hyperopt/fmin.py\u001b[0m in \u001b[0;36mserial_evaluate\u001b[0;34m(self, N)\u001b[0m\n\u001b[1;32m    163\u001b[0m                 \u001b[0mctrl\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mbase\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mCtrl\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrials\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcurrent_trial\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtrial\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    164\u001b[0m                 \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 165\u001b[0;31m                     \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdomain\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevaluate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mspec\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mctrl\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    166\u001b[0m                 \u001b[0;32mexcept\u001b[0m \u001b[0mException\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    167\u001b[0m                     \u001b[0mlogger\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0merror\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"job exception: %s\"\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0me\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/software/env/AI/lib/python3.7/site-packages/hyperopt/base.py\u001b[0m in \u001b[0;36mevaluate\u001b[0;34m(self, config, ctrl, attach_attachments)\u001b[0m\n\u001b[1;32m    892\u001b[0m                 \u001b[0mprint_node_on_error\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrec_eval_print_node_on_error\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    893\u001b[0m             )\n\u001b[0;32m--> 894\u001b[0;31m             \u001b[0mrval\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpyll_rval\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    895\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    896\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrval\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnumber\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m<ipython-input-9-ddc67e79c855>\u001b[0m in \u001b[0;36mf\u001b[0;34m(params)\u001b[0m\n\u001b[1;32m      1\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mparams\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m     \u001b[0macc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mhyperopt_train_test\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mparams\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      3\u001b[0m     \u001b[0;32mreturn\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m'loss'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;34m-\u001b[0m\u001b[0macc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'status'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mSTATUS_OK\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m<ipython-input-19-440beac2549d>\u001b[0m in \u001b[0;36mhyperopt_train_test\u001b[0;34m(params)\u001b[0m\n\u001b[1;32m      1\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mhyperopt_train_test\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mparams\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      2\u001b[0m     \u001b[0mclf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mxgb\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mXGBClassifier\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m**\u001b[0m\u001b[0mparams\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m     \u001b[0;32mreturn\u001b[0m \u001b[0mcross_val_score\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclf\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mX_train\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0my_train\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmean\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      5\u001b[0m spacegdbt = {\n",
      "\u001b[0;32m~/software/env/AI/lib/python3.7/site-packages/sklearn/model_selection/_validation.py\u001b[0m in \u001b[0;36mcross_val_score\u001b[0;34m(estimator, X, y, groups, scoring, cv, n_jobs, verbose, fit_params, pre_dispatch, error_score)\u001b[0m\n\u001b[1;32m    388\u001b[0m                                 \u001b[0mfit_params\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfit_params\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    389\u001b[0m                                 \u001b[0mpre_dispatch\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mpre_dispatch\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 390\u001b[0;31m                                 error_score=error_score)\n\u001b[0m\u001b[1;32m    391\u001b[0m     \u001b[0;32mreturn\u001b[0m \u001b[0mcv_results\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'test_score'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    392\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/software/env/AI/lib/python3.7/site-packages/sklearn/model_selection/_validation.py\u001b[0m in \u001b[0;36mcross_validate\u001b[0;34m(estimator, X, y, groups, scoring, cv, n_jobs, verbose, fit_params, pre_dispatch, return_train_score, return_estimator, error_score)\u001b[0m\n\u001b[1;32m    234\u001b[0m             \u001b[0mreturn_times\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mreturn_estimator\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mreturn_estimator\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    235\u001b[0m             error_score=error_score)\n\u001b[0;32m--> 236\u001b[0;31m         for train, test in cv.split(X, y, groups))\n\u001b[0m\u001b[1;32m    237\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    238\u001b[0m     \u001b[0mzipped_scores\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mzip\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mscores\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/software/env/AI/lib/python3.7/site-packages/joblib/parallel.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, iterable)\u001b[0m\n\u001b[1;32m   1002\u001b[0m             \u001b[0;31m# remaining jobs.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1003\u001b[0m             \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_iterating\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1004\u001b[0;31m             \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdispatch_one_batch\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0miterator\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1005\u001b[0m                 \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_iterating\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_original_iterator\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1006\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/software/env/AI/lib/python3.7/site-packages/joblib/parallel.py\u001b[0m in \u001b[0;36mdispatch_one_batch\u001b[0;34m(self, iterator)\u001b[0m\n\u001b[1;32m    833\u001b[0m                 \u001b[0;32mreturn\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    834\u001b[0m             \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 835\u001b[0;31m                 \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_dispatch\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtasks\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    836\u001b[0m                 \u001b[0;32mreturn\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    837\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/software/env/AI/lib/python3.7/site-packages/joblib/parallel.py\u001b[0m in \u001b[0;36m_dispatch\u001b[0;34m(self, batch)\u001b[0m\n\u001b[1;32m    752\u001b[0m         \u001b[0;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_lock\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    753\u001b[0m             \u001b[0mjob_idx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_jobs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 754\u001b[0;31m             \u001b[0mjob\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_backend\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mapply_async\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbatch\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcallback\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    755\u001b[0m             \u001b[0;31m# A job can complete so quickly than its callback is\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    756\u001b[0m             \u001b[0;31m# called before we get here, causing self._jobs to\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/software/env/AI/lib/python3.7/site-packages/joblib/_parallel_backends.py\u001b[0m in \u001b[0;36mapply_async\u001b[0;34m(self, func, callback)\u001b[0m\n\u001b[1;32m    207\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mapply_async\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcallback\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    208\u001b[0m         \u001b[0;34m\"\"\"Schedule a func to be run\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 209\u001b[0;31m         \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mImmediateResult\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    210\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mcallback\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    211\u001b[0m             \u001b[0mcallback\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/software/env/AI/lib/python3.7/site-packages/joblib/_parallel_backends.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, batch)\u001b[0m\n\u001b[1;32m    588\u001b[0m         \u001b[0;31m# Don't delay the application, to avoid keeping the input\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    589\u001b[0m         \u001b[0;31m# arguments in memory\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 590\u001b[0;31m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mresults\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mbatch\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    591\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    592\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/software/env/AI/lib/python3.7/site-packages/joblib/parallel.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    254\u001b[0m         \u001b[0;32mwith\u001b[0m \u001b[0mparallel_backend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_backend\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn_jobs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_n_jobs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    255\u001b[0m             return [func(*args, **kwargs)\n\u001b[0;32m--> 256\u001b[0;31m                     for func, args, kwargs in self.items]\n\u001b[0m\u001b[1;32m    257\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    258\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0m__len__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/software/env/AI/lib/python3.7/site-packages/joblib/parallel.py\u001b[0m in \u001b[0;36m<listcomp>\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m    254\u001b[0m         \u001b[0;32mwith\u001b[0m \u001b[0mparallel_backend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_backend\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn_jobs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_n_jobs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    255\u001b[0m             return [func(*args, **kwargs)\n\u001b[0;32m--> 256\u001b[0;31m                     for func, args, kwargs in self.items]\n\u001b[0m\u001b[1;32m    257\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    258\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0m__len__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/software/env/AI/lib/python3.7/site-packages/sklearn/model_selection/_validation.py\u001b[0m in \u001b[0;36m_fit_and_score\u001b[0;34m(estimator, X, y, scorer, train, test, verbose, parameters, fit_params, return_train_score, return_parameters, return_n_test_samples, return_times, return_estimator, error_score)\u001b[0m\n\u001b[1;32m    513\u001b[0m             \u001b[0mestimator\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX_train\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mfit_params\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    514\u001b[0m         \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 515\u001b[0;31m             \u001b[0mestimator\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX_train\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my_train\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mfit_params\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    516\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    517\u001b[0m     \u001b[0;32mexcept\u001b[0m \u001b[0mException\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/software/env/AI/lib/python3.7/site-packages/xgboost/sklearn.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, X, y, sample_weight, eval_set, eval_metric, early_stopping_rounds, verbose, xgb_model, sample_weight_eval_set, callbacks)\u001b[0m\n\u001b[1;32m    730\u001b[0m                               \u001b[0mevals_result\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mevals_result\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mobj\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mobj\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfeval\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfeval\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    731\u001b[0m                               \u001b[0mverbose_eval\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mverbose\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mxgb_model\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mxgb_model\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 732\u001b[0;31m                               callbacks=callbacks)\n\u001b[0m\u001b[1;32m    733\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    734\u001b[0m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mobjective\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mxgb_options\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"objective\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/software/env/AI/lib/python3.7/site-packages/xgboost/training.py\u001b[0m in \u001b[0;36mtrain\u001b[0;34m(params, dtrain, num_boost_round, evals, obj, feval, maximize, early_stopping_rounds, evals_result, verbose_eval, xgb_model, callbacks, learning_rates)\u001b[0m\n\u001b[1;32m    214\u001b[0m                            \u001b[0mevals\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mevals\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    215\u001b[0m                            \u001b[0mobj\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mobj\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfeval\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfeval\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 216\u001b[0;31m                            xgb_model=xgb_model, callbacks=callbacks)\n\u001b[0m\u001b[1;32m    217\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    218\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/software/env/AI/lib/python3.7/site-packages/xgboost/training.py\u001b[0m in \u001b[0;36m_train_internal\u001b[0;34m(params, dtrain, num_boost_round, evals, obj, feval, xgb_model, callbacks)\u001b[0m\n\u001b[1;32m     72\u001b[0m         \u001b[0;31m# Skip the first update if it is a recovery step.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     73\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mversion\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0;36m2\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 74\u001b[0;31m             \u001b[0mbst\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mupdate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdtrain\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mobj\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     75\u001b[0m             \u001b[0mbst\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msave_rabit_checkpoint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     76\u001b[0m             \u001b[0mversion\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/software/env/AI/lib/python3.7/site-packages/xgboost/core.py\u001b[0m in \u001b[0;36mupdate\u001b[0;34m(self, dtrain, iteration, fobj)\u001b[0m\n\u001b[1;32m   1107\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mfobj\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1108\u001b[0m             _check_call(_LIB.XGBoosterUpdateOneIter(self.handle, ctypes.c_int(iteration),\n\u001b[0;32m-> 1109\u001b[0;31m                                                     dtrain.handle))\n\u001b[0m\u001b[1;32m   1110\u001b[0m         \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1111\u001b[0m             \u001b[0mpred\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpredict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdtrain\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m: "
     ]
    }
   ],
   "source": [
    "start = time.time()\n",
    "\n",
    "best = fmin(f, spacegdbt, algo=tpe.suggest, max_evals=100, trials=trialsgdbt)\n",
    "print_params_bast(best,spacegdbt)\n",
    "plt_trials(trialsgdbt)\n",
    "\n",
    "end = time.time()\n",
    "print(str(end-start))  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### CatBoostClassifier cat 参数搜索"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 最好的参数{'depth': 2, 'iterations': 15, 'learning_rate': 0.28758790269878165}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def hyperopt_train_test(params):\n",
    "    clf = CatBoostClassifier(**params)\n",
    "    return cross_val_score(clf,X_train,y_train).mean()\n",
    "\n",
    "spacecat = {\n",
    "    'iterations': hp.choice('iterations', np.arange(100,2000,100)),\n",
    "    'depth': hp.choice('depth', np.arange(2,10)),\n",
    "    'learning_rate': hp.uniform('learning_rate', 0.1, 0.7),\n",
    "}\n",
    "\n",
    "trialscat = Trials()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "start = time.time()\n",
    "\n",
    "best = fmin(f, spacecat, algo=tpe.suggest, max_evals=100, trials=trialscat)\n",
    "print_params_bast(best,trialscat)\n",
    "plt_trials(trialscat)\n",
    "\n",
    "end = time.time()\n",
    "print(str(end-start))  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### AdaBoostClassifier ada 参数搜索"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def hyperopt_train_test(params):\n",
    "    clf = AdaBoostClassifier(**params)\n",
    "    return cross_val_score(clf,X_train,y_train).mean()\n",
    "\n",
    "spaceada = {\n",
    "    'n_estimators': hp.choice('n_estimators', np.arange(200,3000,100)),\n",
    "    'learning_rate': hp.uniform('learning_rate', 0.1, 0.7),\n",
    "    \"algorithm\" : \"SAMME\",\n",
    "    \"base_estimator\":lgb.LGBMClassifier(learning_rate=0.22149993885702932,\n",
    "                                         min_child_samples=7, #它的值取决于训练数据的样本个树和num_leaves. 将其设置的较大可以避免生成一个过深的树, 但有可能导致欠拟合。\n",
    "                                         max_depth=7, #设置树深度，深度越大可能过拟合\n",
    "                                         lambda_l1=2,boosting=\"gbdt\",objective=\"multiclass\",\n",
    "                                         n_estimators=2400,metric='multi_error',num_class=3,\n",
    "                                         feature_fraction=0.75,bagging_fraction=0.85,seed=99,\n",
    "                                         num_threads=20,verbose=-1,n_jobs=-1,device=\"cpu\")\n",
    "}\n",
    "\n",
    "trialsada = Trials()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "start = time.time()\n",
    "\n",
    "best = fmin(f, spaceada, algo=tpe.suggest, max_evals=100, trials=trialsada)\n",
    "print_params_bast(best,trialsada)\n",
    "plt_trials(trialsada)\n",
    "\n",
    "end = time.time()\n",
    "print(str(end-start))  "
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
